// 字符串子应用沙箱执行器（支持外部依赖注入）
// 约定：字符串代码需导出一个全局函数 window.__string_app_mount__ = (api) => {}

export function createStringAppSandbox(sourceCode, api) {
  return new Promise((resolve, reject) => {
  const container = api && api.mount
  if (!container) { reject(new Error('未提供挂载节点')); return }

  // 清空
  container.innerHTML = ''

  // 创建隔离 iframe 作为弱沙箱（同源）
  const iframe = document.createElement('iframe')
  // allow-scripts allow-forms allow-same-origin allow-popups
  iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin')
  iframe.style.width = '100%'
  iframe.style.border = '0'
  iframe.style.height = '100%'
  container.appendChild(iframe)

  const doc = iframe.contentDocument
  const win = iframe.contentWindow

  // 提供必要依赖（Vue 2）和一个根节点
  const rootId = 'app-root-' + Date.now()
  doc.open()
  doc.write(`<!doctype html><html><head></head><body><div id="${rootId}"></div></body></html>`) 
  doc.close()

  // 挂载 API 到沙箱全局
  win.__APP_API__ = { ...api, mount: doc.getElementById(rootId) }
  
  // 为 iframe 内提供简单的页面级导航（当前用于 form 的支付流程）
  win.__APP_API__.navigate = function(page, payload) {
    const mountEl = win.__APP_API__.mount
    if (!mountEl) return
    const currentApp = api.currentApp || 'admin'
    if (currentApp === 'form') {
      if (page === 'pay') {
        mountEl.innerHTML = '<div style="padding:16px;text-align:center;">\n  <h2>支付中心</h2>\n  <p>正在拉起支付...</p>\n</div>'
        setTimeout(() => { try { win.__APP_API__.navigate('success') } catch (_) {} }, 1200)
        return
      }
      if (page === 'success') {
        mountEl.innerHTML = '<div style="padding:16px;text-align:center;">\n  <h2>支付成功</h2>\n  <p>感谢使用</p>\n  <button id="backBtn" style="margin-top:12px;">返回表单</button>\n</div>'
        const backBtn = mountEl.querySelector('#backBtn')
        if (backBtn) {
          backBtn.addEventListener('click', () => {
            if (typeof win.__string_app_mount__ === 'function') {
              win.__string_app_mount__(win.__APP_API__)
            }
          })
        }
        return
      }
    }
  }

  // 复用容器（host）样式到 iframe：拷贝 link 与开发态的 style，并监听新增变化
  try {
    const hostDoc = window.document
    const iframeDoc = doc

    const copyLink = (linkEl) => {
      const href = linkEl.getAttribute('href') || ''
      if (!href) return
      const exists = Array.from(iframeDoc.querySelectorAll('link[rel="stylesheet"]'))
        .some(l => (l.getAttribute('href') || '') === href)
      if (exists) return
      const clone = iframeDoc.createElement('link')
      clone.rel = 'stylesheet'
      clone.href = href
      iframeDoc.head.appendChild(clone)
    }

    const copyStyle = (styleEl) => {
      // 仅复制 Vite 开发态注入的样式，避免把业务 style scoped 也复制两份
      const isViteDevStyle = styleEl.hasAttribute('data-vite-dev-id') || styleEl.hasAttribute('vite-dev-id')
      if (!isViteDevStyle) return
      const id = styleEl.getAttribute('data-vite-dev-id') || styleEl.getAttribute('vite-dev-id')
      if (!id) return
      // 去重：按 dev-id 查找
      const exists = Array.from(iframeDoc.querySelectorAll('style'))
        .some(s => (s.getAttribute('data-vite-dev-id') || s.getAttribute('vite-dev-id')) === id)
      if (exists) return
      const clone = iframeDoc.createElement('style')
      clone.setAttribute('data-vite-dev-id', id)
      clone.textContent = styleEl.textContent || ''
      iframeDoc.head.appendChild(clone)
    }

    // 初始复制：link 与（开发态）style
    hostDoc.querySelectorAll('link[rel="stylesheet"]').forEach(copyLink)
    hostDoc.querySelectorAll('style').forEach(copyStyle)

    // 监听 host 头部样式变更，动态同步到 iframe
    const observer = new MutationObserver((mutations) => {
      for (const m of mutations) {
        m.addedNodes && m.addedNodes.forEach((n) => {
          if (!(n instanceof Element)) return
          if (n.tagName === 'LINK' && n.getAttribute('rel') === 'stylesheet') {
            copyLink(n)
          } else if (n.tagName === 'STYLE') {
            copyStyle(n)
          }
        })
      }
    })
    observer.observe(hostDoc.head, { childList: true, subtree: true })
  } catch (_) {}

  // 注入外部依赖到沙箱环境
  // 注意：生产上建议改为外链 CDN 并以 UMD 形式注入
  if (api.Vue) {
    win.Vue = api.Vue
  }
  // 如果容器没传，则兜底使用容器 window 上的全局
  if (!win.Vue && window.Vue) {
    win.Vue = window.Vue
  }
  
  // 注入 ElementUI（如果存在）并在沙箱中安装
  if (window.ELEMENT) {
    win.ELEMENT = window.ELEMENT
    if (win.Vue && typeof win.Vue.use === 'function') {
      try { win.Vue.use(win.ELEMENT) } catch (e) {}
    }
  }
  
  // 注入 Vant 全局变量（如果存在）并在沙箱中安装
  if (window.Vant) {
    win.Vant = window.Vant
    if (win.Vue && typeof win.Vue.use === 'function') {
      try { win.Vue.use(win.Vant) } catch (e) {}
    }
  }

  // 注入 axios（如果存在），供字符串应用直接使用外部网络能力
  if (window.axios) {
    win.axios = window.axios
    try {
      if (win.__APP_API__) {
        win.__APP_API__.axios = window.axios
      }
    } catch (_) {}
  }

  // 自动加载样式文件（如果存在），并在样式就绪后再挂载
  const currentApp = api.currentApp || 'admin'
  const styleLink = doc.createElement('link')
  styleLink.rel = 'stylesheet'
  styleLink.href = `http://localhost:7070/app-style?app=${currentApp}`
  let mountedDone = false
  const safeMount = () => {
    if (mountedDone) return
    mountedDone = true
    try {
      if (typeof win.__string_app_mount__ === 'function') {
        win.__string_app_mount__(win.__APP_API__)
        resolve({ iframe, win, doc })
      } else {
        reject(new Error('字符串应用未定义 window.__string_app_mount__'))
      }
    } catch (e) {
      reject(e)
    }
  }
  styleLink.onload = safeMount
  styleLink.onerror = safeMount
  setTimeout(safeMount, 1000)
  doc.head.appendChild(styleLink)

  // 执行字符串代码（先注入，等待样式就绪后再触发挂载）
  const script = doc.createElement('script')
  script.type = 'text/javascript'
  script.textContent = sourceCode
  console.log(typeof script,'qqqqq')
  doc.body.appendChild(script)
  })
}


